//
//  WBNetworkManager.swift
//  赝品微博
//
//  Created by 刘浩林 on 2016/11/7.
//  Copyright © 2016年 刘浩林. All rights reserved.
//

import UIKit
import AFNetworking

//swift的枚举支持任意类型
//swift/enum在 OC中只支持整数
enum WBHTTPMethod{
    case GET
    case POST

}

//网络管理工具
class WBNetworkManager: AFHTTPSessionManager {

    //静态区/常量不允许修改/闭包/
    //在第一次访问时执行闭包,并将结果保存在 shared 常量中
    static let shared = WBNetworkManager()

    //访问令牌,所有网络请求,都基于此令牌(登录除外)
    //为了保护用户安全,访问令牌有时限,默认用户是三天
    //模拟token过期
    var accessToken : String?
    //= "2.00PiO2nDnL8VRC47b23486e6eiZCvC"


    var userLogon :Bool{
        return accessToken != nil
    }

    //专门负责拼接token的网络请求方法
    func tokenRequest(method:WBHTTPMethod = .GET,URLString: String,parameters:[String: Any]?,completion:@escaping (_ json: Any?,_ isSuccess:Bool)->()) -> () {

        //处理token字典
        //判断token是否为nil,为nil直接返回
        guard let token = accessToken else {
            print("没有token,需要登录")
            completion(nil, false)
            return
        }
        //判断参数字典parameters是否存在,如果为nil,应该新建一个字典
        var parameters = parameters

        if parameters == nil {
            parameters = [String:Any]()
        }
        //设置参数字典,代码在此处字典一定有值
        parameters!["access_token"] = token
        //调用request发起真正网络请求方法
        request(URLString: URLString, parameters: parameters!, completion: completion)
    }
    //使用一个函数封装 AFN 的 GET / POST 请求

    /// f封装 AFN 的GET/POST请求
    ///
    /// - Parameters:
    ///   - method: GET/POST
    ///   - URLString: URLString
    ///   - parameters: 参数字典
    ///   - completion: 完成回调[json(字典/数组),是否成功]
    func request(method:WBHTTPMethod = .GET,URLString: String,parameters:[String: Any],completion:@escaping (_ json: Any?,_ isSuccess:Bool)->()) {
        //成功回调
        let success = { (task: URLSessionDataTask, json:Any?)->() in
            completion(json, true)
        }
        //失败回调
        let failure = { (task: URLSessionDataTask?,error:Error)->Void in


        //针对403处理token过期
            //对于测试用户,每天的刷新量是有限的
            //超出上限,token会被锁定一段时间
            //解决办法,新建一个应用程序

           if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                print("token过期了")

            //FIXME:发送通知,提示用户重新登录(本方法不知道被谁调用,谁接收到谁做处理)
            }
            print("网络请求错误 \(error)")

            completion(nil, false)
        }

        if method == .GET {
 get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)

        }else{

       
        post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
    }
}
